package chaoyue.study.inner;

/**
 * 成员内部类
 * 为了避免类名重复，实际生成的类名其实是Outer$Inner这种形式，即JVM会自动帮我们拼上外部类的类名
 * 外部类的private属性/方法JVM都会帮我们自动生成一个对应的access方法，以提供给内部类访问。
 */
public class MemberInnerClassTest {
    private int a = 100;

    public class Inner {
        public void innerMethod() {
            // 因为定义在内部，可以使用outer的private变量
            System.out.println("outer a" + a);
            // 这里的Outer.this其实是多余的，因为内部类中并没有定义action方法
            // 如果内部类中也定义了action方法，需要调用外部类中的属性和方法则需要通过这种方式指明
            MemberInnerClassTest.this.action();
        }

        public void innerStaticMethod() {
            System.out.println("inner-static");
        }
    }

    private void action() {
        System.out.println("action");
    }

    public static void main(String[] args) {
        // 要先构造outer对象，才能根据outer对象构建inner对象
        MemberInnerClassTest outer = new MemberInnerClassTest();
        Inner inner = outer.new Inner();
        inner.innerMethod();
        inner.innerStaticMethod(); //静态方法也只能先把对象构造出来
    }
}
